#include "c2_flash.h"
#include "Programmer.h"

uint8_t EnableChNum = EnableChNumMax;
FlashType FlashTarget;

/*********************************************************************
-
-   函数名: void ProgrammerIOInit(void)
-   功能  : 目标编程IO口初始化
-   输入  : 无
-   返回  : 无
-
**********************************************************************/
void ProgrammerIOInit(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    GPIO_InitStruct.Pin = CLK0_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(CLK0_GPIO_Port, &GPIO_InitStruct);
    
    GPIO_InitStruct.Pin = DIO0_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(DIO0_GPIO_Port, &GPIO_InitStruct);
}

/*********************************************************************
-
-   函数名: void T_CLK_0(void)
-   功能  : 设置CLK输出为0
-   输入  : 无
-   返回  : 无
-
**********************************************************************/
void T_CLK_0(void)
{
    CLK0_GPIO_Port->BSRR = (uint32_t)CLK0_Pin << 16u;
}

/*********************************************************************
-
-   函数名: void T_CLK_1(void)
-   功能  : 设置CLK输出为1
-   输入  : 无
-   返回  : 无
-
**********************************************************************/
void T_CLK_1(void)
{
    CLK0_GPIO_Port->BSRR = CLK0_Pin;
}

/*********************************************************************
-
-   函数名: void T_DAT_0(void)
-   功能  : 设置DAT输出为0
-   输入  : 无
-   返回  : 无
-
**********************************************************************/
void T_DAT_0(void)
{
    DIO0_GPIO_Port->BSRR = (uint32_t)DIO0_Pin << 16u;
}

/*********************************************************************
-
-   函数名: void T_DAT_1(void)
-   功能  : 设置DAT输出为1
-   输入  : 无
-   返回  : 无
-
**********************************************************************/
void T_DAT_1(void)
{
    DIO0_GPIO_Port->BSRR = DIO0_Pin;
}

/*********************************************************************
-
-   函数名: uint8_t ICP_DAT_Read(uint8_t Ch)
-   功能  : 读取DAT线的数据
-   输入  : Ch:需要读取的线号,范围0-7
-   返回  : DAT线的数据
-
**********************************************************************/
GPIO_PinState ICP_DAT_Read(uint8_t Ch)
{
    return ((DIO0_GPIO_Port->IDR & DIO0_Pin) == (uint32_t)GPIO_PIN_RESET)?GPIO_PIN_RESET:GPIO_PIN_SET;
}

/*********************************************************************
-
-   函数名: void ICP_DAT_OUT_ENABLE(void)
-   功能  : 设置DAT线为输出模式
-   输入  : 无
-   返回  : 无
-
**********************************************************************/
void ICP_DAT_OUT_ENABLE(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    GPIO_InitStruct.Pin = DIO0_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(DIO0_GPIO_Port, &GPIO_InitStruct);
}

/*********************************************************************
-
-   函数名: void ICP_DAT_OUT_DISABLE(void)
-   功能  : 设置DAT线为输入模式
-   输入  : 无
-   返回  : 无
-
**********************************************************************/
void ICP_DAT_OUT_DISABLE(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    GPIO_InitStruct.Pin = DIO0_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(DIO0_GPIO_Port, &GPIO_InitStruct);
}

/*********************************************************************
-
-   函数名: void ProgrammerWork(FlashType *Target)
-   功能  : 编程器根据厂家和对应的型号加载文件进行烧录工作
-   输入  : Target:烧写信息结构体地址
-   返回  : 无
-
**********************************************************************/
void ProgrammerWork(FlashType *Target)
{
    C2_Programmer(Target);
}

/*********************************************************************
-
-   函数名: void ProgrammerInit(void)
-   功能  : 编程器初始化
-   输入  : 无
-   返回  : 无
-
**********************************************************************/
void ProgrammerInit(void)
{
	FlashTarget.Start = 0;
	memset(FlashTarget.FW_Buf,0x00,sizeof(FlashTarget.FW_Buf));
    ProgrammerIOInit();
}



